package com.lswms.modules.lswms.controller.receipt;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.druid.util.StringUtils;
import com.lswms.common.annotation.LogOperation;
import com.lswms.common.constant.Constant;
import com.lswms.common.page.PageData;
import com.lswms.common.utils.ExcelUtils;
import com.lswms.common.utils.Result;
import com.lswms.common.validator.AssertUtils;
import com.lswms.common.validator.ValidatorUtils;
import com.lswms.common.validator.group.AddGroup;
import com.lswms.common.validator.group.DefaultGroup;
import com.lswms.common.validator.group.UpdateGroup;
import com.lswms.modules.lswms.MEGConstant;
import com.lswms.modules.lswms.dao.receipt.ReceiptdetailDao;
import com.lswms.modules.lswms.dto.receipt.ReceiptDTO;
import com.lswms.modules.lswms.entity.receipt.ReceiptEntity;
import com.lswms.modules.lswms.excel.receipt.ReceiptExcel;
import com.lswms.modules.lswms.service.receipt.ReceiptService;
import com.lswms.modules.lswms.service.receipt.ReceiptdetaillistService;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import springfox.documentation.annotations.ApiIgnore;

/**
 * 收货
 *
 * @author DX
 * @since 1.0.0 2021-06-13
 */
@RestController
@RequestMapping("lswms/receipt")
@Api(tags = "收货")
public class ReceiptController {
	@Autowired
	private ReceiptService receiptService;

	@Autowired
	private ReceiptdetaillistService receiptdetaillistService;

	@Autowired
	private ReceiptdetailDao receiptdetailDao;

	@GetMapping("page")
	@ApiOperation("分页")
	@ApiImplicitParams({
			@ApiImplicitParam(name = Constant.PAGE, value = "当前页码，从1开始", paramType = "query", required = true, dataType = "int"),
			@ApiImplicitParam(name = Constant.LIMIT, value = "每页显示记录数", paramType = "query", required = true, dataType = "int"),
			@ApiImplicitParam(name = Constant.ORDER_FIELD, value = "排序字段", paramType = "query", dataType = "String"),
			@ApiImplicitParam(name = Constant.ORDER, value = "排序方式，可选值(asc、desc)", paramType = "query", dataType = "String") })
//	@RequiresPermissions("lswms:receipt:page")
	public Result<PageData<ReceiptEntity>> page(@ApiIgnore HttpServletRequest request) {
		// String name = request.getParameter("name");
		try {
			PageData<ReceiptEntity> page = receiptService.pageRequest(request);
			return new Result<PageData<ReceiptEntity>>().ok(page);
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}

	}

	@GetMapping("{id}")
	@ApiOperation("信息")
//	@RequiresPermissions("lswms:receipt:info")
	public Result<ReceiptDTO> get(@PathVariable("id") Long id) {
		try {
			ReceiptDTO data = receiptService.get(id);

			return new Result<ReceiptDTO>().ok(data);
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}
	}

	@PostMapping
	@ApiOperation("保存")
	@LogOperation("保存")
	@RequiresPermissions("lswms:receipt:save")
	public Result save(@RequestBody ReceiptDTO dto) {
		try {
			// 效验数据
			ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);

			receiptService.save(dto);

			return new Result();
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}
	}

	@PutMapping
	@ApiOperation("修改")
	@LogOperation("修改")
	@RequiresPermissions("lswms:receipt:update")
	public Result update(@RequestBody ReceiptDTO dto) {
		try {
			// 效验数据
			ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);

			receiptService.update(dto);

			return new Result();
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}
	}

	@DeleteMapping
	@ApiOperation("删除")
	@LogOperation("删除")
	@RequiresPermissions("lswms:receipt:delete")
	public Result delete(@RequestBody Long[] ids) {
		try {// 效验数据
			AssertUtils.isArrayEmpty(ids, "id");
			for (Long id : ids) {
				ReceiptDTO receiptDTO = receiptService.get(id);
				Integer status = receiptDTO.getStatus();
				if (status != 0) {
					return new Result().error(1, "非新建状态，不容许删除");
				}
			}
			for (Long id : ids) {
				if (receiptService.get(id) != null) {
					ReceiptDTO receiptDTO = receiptService.get(id);
					String receiptkey = receiptDTO.getReceiptkey();
					receiptdetailDao.deleteByReceiptkey(receiptkey);
				}
			}
			receiptService.delete(ids);

			return new Result();
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}
	}

	@GetMapping("export")
	@ApiOperation("导出")
	@LogOperation("导出")
	@RequiresPermissions("lswms:receipt:export")
	public void export(@ApiIgnore @RequestParam Map<String, Object> params, HttpServletResponse response)
			throws Exception {
		List<ReceiptDTO> list = receiptService.list(params);

		ExcelUtils.exportExcelToTarget(response, null, list, ReceiptExcel.class);

	}

	@GetMapping("createPutaway")
	@ApiOperation("生成上架任务")
	@LogOperation("生成上架任务")
	@RequiresPermissions("lswms:receipt:createPutaway")
	public Result createPutaway(@RequestParam String receiptkey) {

		try {
			// 效验数据
			// AssertUtils.isArrayEmpty(receiptkey, "receiptkey");
			String msg = receiptdetaillistService.putaway(receiptkey);

			if (StringUtils.isEmpty(msg)) {
				return new Result();
			} else {
				return new Result().error(msg);
			}
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}

	}

	@GetMapping("closeReceipt")
	@ApiOperation("关闭收货单")
	@LogOperation("关闭收货单")
	@RequiresPermissions("lswms:receipt:closeReceipt")
	public Result closeReceipt(@RequestParam String receiptkey) {
		try {
			// 效验数据
			// AssertUtils.isArrayEmpty(receiptkey, "receiptkey");
			String msg = receiptService.closeReceipt(receiptkey);

			if (StringUtils.isEmpty(msg)) {
				return new Result();
			} else {
				return new Result().error(msg);
			}
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}

	}

	@GetMapping("cancelReaceipt")
	@ApiOperation("撤销收货")
	@LogOperation("撤销收货")
	@RequiresPermissions("lswms:receipt:cancelReaceipt")
	public Result cancelReaceipt(@RequestParam String receiptkey) {
		try {
			// 效验数据
			// AssertUtils.isArrayEmpty(receiptkey, "receiptkey");
			String msg = receiptService.cancelReaceipt(receiptkey);

			if (StringUtils.isEmpty(msg)) {
				return new Result();
			} else {
				return new Result().error(msg);
			}
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}
	}

	@GetMapping("redoReaceipt")
	@ApiOperation("重新激活")
	@LogOperation("重新激活")
	@RequiresPermissions("lswms:receipt:redoReaceipt")
	public Result redoReaceipt(@RequestParam String receiptkey) {

		try {
			// 效验数据
			// AssertUtils.isArrayEmpty(receiptkey, "receiptkey");
			String msg = receiptService.redoReaceipt(receiptkey);

			if (StringUtils.isEmpty(msg)) {
				return new Result();
			} else {
				return new Result().error(msg);
			}
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}
	}
	
	
	@PostMapping("qcCreate")
	@ApiOperation("QC生成入库单")
	@LogOperation("QC生成入库单")
	//@RequiresPermissions("lswms:receipt:save")
	public Result qcCreate(@RequestBody Map map) {
		try {
			// 效验数据
			String msg = receiptService.qcCreate(map);
			if(StringUtils.isEmpty(msg)) {
				return new Result();
			}else {
				return new Result().error(msg);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}
	}
	
	@PostMapping("getPrintQc")
	@ApiOperation("QC生成入库单")
	@LogOperation("QC生成入库单")
	//@RequiresPermissions("lswms:receipt:save")
	public Result getPrintQc(@ApiIgnore @RequestBody Map<String, Object> params) {
		try {
			
			// 效验数据
			List<Map<String,Object>> list = receiptService.getPrintQc(params);
			if( list.size()>0) {
				return new Result().ok(list);
			}else {
 				return new Result().error("无数据可以打印");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}
	}
	@PostMapping("receiptEmptyLPN")
	//@RequiresPermissions("lswms:receipt:save")
	public Result receiptEmptyLPN(@ApiIgnore @RequestBody Map<String, Object> params) {
		try {
			String msg = receiptService.receiptEmptyLPN(params);

			if (StringUtils.isEmpty(msg)) {
				return new Result();
			} else {
				return new Result().error(msg);
			}
		} catch (Exception e) {
			e.printStackTrace();
			return new Result().error(MEGConstant.IS_ERROR);
		}
	}
	
}
